#include "threadpool.h"

void GetFile(int peerfd,char* data,pThread_pool_t p)
{
    printf("in GetFile peerfd = %d\n", peerfd);
    //拿取文件传输任务节点初始化
    pfile_t pfileNode = findNode(peerfd, &p->fileque);
    printf("after findNode\n");
    printf("pfindNode->filename = %s\n",pfileNode->filename);
    int flag = 200; //仅用于同步，其他没啥用
    if (strcmp(pfileNode->filename, "") == 0)
    {
        printf("1.文件名为:%s\n", data);
        //初始化结点信息
        pfileNode->peerfd = peerfd;
        strcpy(pfileNode->filename, data);
        pfileNode->next = NULL;
        //返回同步信息
        send(peerfd, &flag, 4, MSG_WAITALL);
    }
    else if (pfileNode->md5Sys == 0)
    {
        printf("2.md5 = %s\n", data);
        memset(&pfileNode->md5, 0, 33);
        strcpy(pfileNode->md5, data);
        send(peerfd, &flag, 4, MSG_WAITALL);
        pfileNode->md5Sys = 1;
    }
    else if (pfileNode->fileSys == 0)
    {
        int filelength = atoi(data);
        printf("3.文件长度为:%d\n", filelength);
        //同步
        // 1.先接收文件长度
        pfileNode->fileSize = filelength;
        // 2.创建文件。返回文件大小，实现断点续传.data首次代表文件名，后续代表数据
        printf("peerfd = %d\n", pfileNode->peerfd);
        printf("create file:%s\n", pfileNode->filename);
        int fd = open(pfileNode->md5, O_CREAT | O_RDWR, 0664);
        struct stat st;
        memset(&st, 0, sizeof(st));
        fstat(fd, &st);
        send(peerfd, &st.st_size, 8, MSG_WAITALL);
        //更新节点信息
        pfileNode->fileRecvSize = st.st_size;
        pfileNode->fileSys = 1; //文件大小已同步可以进行传输
        close(fd);
        if (pfileNode->fileRecvSize >= pfileNode->fileSize)
        {
            printf("文件已经存在\n");
            //判断上传文件内是否有相同文件，是则引用计数加1，不是则不变
            //判断当前目录id下是否有文件名为md5，有则不变，没有则计数加1,并插入数据库
            //引用计数加一
            hashmap_add(p->Md5hashmap,pfileNode->md5);
            printf("秒传：引用计数:%d\n",hashmap_get(p->Md5hashmap,pfileNode->md5));
            //插入数据库


            FilequeRecoverque(&p->fileque, pfileNode);
        }
    }
    else
    {
        int fd = open(pfileNode->md5, O_RDWR);
        // 2.1移动文件读写指针到文件末尾
        lseek(fd, 0, SEEK_END);

        // 3.接收文件(可以增加断开连接时，清除文件传输队列的结点)
        char buf[1025] = {0};
        strcpy(buf,data);
        write(fd, buf, strlen(buf));
        //更新结点信息
        pfileNode->fileRecvSize += strlen(buf);
        close(fd);
        send(peerfd, &flag, 4, MSG_WAITALL);
        if (pfileNode->fileRecvSize >= pfileNode->fileSize)
        {
            //已经接收完毕，从文件传输队列还原初始化结点
            printf("文件传输完毕\n");
            hashmap_put(p->Md5hashmap,pfileNode->md5,1);
            //插入数据库

            printf("上传完毕:引用计数:%d\n",hashmap_get(p->Md5hashmap,pfileNode->md5));
            FilequeRecoverque(&p->fileque, pfileNode);
        }
    }
}
